package com.eian.boot.mybatis.core.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.logicdelete.LogicDeleteManager;
import com.mybatisflex.core.query.QueryWrapper;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author alex.meng
 * @createTime 2024-05-29 18:30
 * @description 项目基础Mapper
 **/
public interface IMapper<T> extends BaseMapper<T> {

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据主键删除数据。如果是多个主键的情况下，需要传入数组，例如：{@code new Integer[]{100,101}}。
     *
     * @param id 主键数据
     * @return 受影响的行数
     */
    default int deleteByIdForce(@Param(FlexConsts.PRIMARY_VALUE) Serializable id) {
        AtomicInteger result = new AtomicInteger();
        LogicDeleteManager.execWithoutLogicDelete(() ->
                result.set(this.deleteById(id))
        );
        return result.get();
    }

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据多个主键批量删除数据。
     *
     * @param ids 主键列表
     * @return 受影响的行数
     */
    default int deleteByIdsForce(@Param(FlexConsts.PRIMARY_VALUE) Collection<? extends Serializable> ids) {
        AtomicInteger result = new AtomicInteger();
        LogicDeleteManager.execWithoutLogicDelete(() ->
                result.set(this.deleteBatchByIds(ids))
        );
        return result.get();
    }

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据多个主键批量删除数据。
     *
     * @param ids  主键列表
     * @param size 切分大小
     * @return 受影响的行数
     */
    default int deleteByIdsForce(Collection<? extends Serializable> ids, int size) {
        AtomicInteger result = new AtomicInteger();
        LogicDeleteManager.execWithoutLogicDelete(() ->
                result.set(this.deleteBatchByIds(ids, size))
        );
        return result.get();
    }

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据查询条件来删除数据。
     *
     * @param queryWrapper 条件
     * @return 受影响的行数
     */
    default int deleteByQueryForce(@Param(FlexConsts.QUERY) QueryWrapper queryWrapper) {
        AtomicInteger result = new AtomicInteger();
        LogicDeleteManager.execWithoutLogicDelete(() ->
                result.set(this.deleteByQuery(queryWrapper))
        );
        return result.get();
    }
}